import { INestApplication } from '@nestjs/common';
import session from 'express-session';

/** 使用 session */
export const setupSession = (app: INestApplication) => {
  app.use(
    session({
      // 用于生成会话签名的密钥,必须项
      secret: 'vue3-template',
      // 设置会话的名字，默认为connect.sid
      name: 'vue3-template',
      // 强制在每个响应上设置会话标识符 cookie。 到期重置为原来的maxAge，重置到期倒计时。默认值为false。
      rolling: true,
      // 是否强制保存会话，即使未被修改也要保存。默认为true
      resave: false,
      // 强制将“未初始化”的会话保存到存储中。
      // 当会话是新的但未被修改时，它是未初始化的。 选择 false 对于实现登录会话、减少服务器存储使用或遵守在设置 cookie 之前需要许可的法律很有用。
      // 选择 false 还有助于解决客户端在没有会话的情况下发出多个并行请求的竞争条件。默认值为 true。
      saveUninitialized: false,
      // Cookie Options
      // 默认为{ path: '/', httpOnly: true, secure: false, maxAge: null }
      /** maxAge: 设置给定过期时间的毫秒数（date）
       * expires: 设定一个utc过期时间，默认不设置，http>=1.1的时代请使用maxAge代替之（string）
       * path: cookie的路径（默认为/）（string）
       * domain: 设置域名，默认为当前域（String）
       * sameSite: 是否为同一站点的cookie（默认为false）（可以设置为['lax', 'none', 'none']或 true）
       * secure: 是否以https的形式发送cookie（false以http的形式。true以https的形式）true 是默认选项。 但是，它需要启用 https 的网站。 如果通过 HTTP 访问您的站点，则不会设置 cookie。 如果使用的是 secure: true，则需要在 express 中设置“trust proxy”。
       * httpOnly: 是否只以http(s)的形式发送cookie，对客户端js不可用（默认为true，也就是客户端不能以document.cookie查看cookie）
       * signed: 是否对cookie包含签名（默认为true）
       * overwrite: 是否可以覆盖先前的同名cookie（默认为true）*/
      cookie: { maxAge: null },
    }),
  );
};
